#include <rtthread.h>
#include <rtdbg.h>
#include <rtdevice.h>
#include <board.h>    // 新串口需要在board.h文件中声明串口引脚和名称
#include "main.h"
#include "rt_thread_demo.h"
#include "../hardware/JY61P/JY61P.h"                // JY61P
#include "../rt-thread/components/drivers/include/drivers/serial.h"
#include "../hardware/USART_ALL/usart_all.h"
#include "../hardware/MS53L/ms53l.h" // MS53L

int jy901_rx_state_flag = 0; // JY901接收状态标志

/*串口定义  board.h文件中
#define BSP_USING_UART1
#define BSP_UART1_TX_PIN       "PA9"
#define BSP_UART1_RX_PIN       "PA10"

#define BSP_USING_UART2
#define BSP_UART2_TX_PIN       "PA2"
#define BSP_UART2_RX_PIN       "PA3"

#define BSP_USING_UART3
#define BSP_UART3_TX_PIN       "PB10"
#define BSP_UART3_RX_PIN       "PB11"

#define BSP_USING_UART4
#define BSP_UART4_TX_PIN       "PA0"
#define BSP_UART4_RX_PIN       "PA1"

#define BSP_USING_UART5
#define BSP_UART5_TX_PIN       "PC12"
#define BSP_UART5_RX_PIN       "PD2"
*/


// 接收缓存数组相关变量
#define MAX_DATA_LEN2 50   // 定义缓冲区大小
#define MAX_DATA_LEN3 50
#define MAX_DATA_LEN4 50
#define MAX_DATA_LEN5 50

int8_t RxData2[MAX_DATA_LEN2] = {0}; // 接收数组
int8_t RxData3[MAX_DATA_LEN3] = {0};
int8_t RxData4[MAX_DATA_LEN4] = {0};
int8_t RxData5[MAX_DATA_LEN5] = {0};

uint8_t RXindex2 = 0; // 接收数组索引
uint8_t RXindex3 = 0;
uint8_t RXindex4 = 0;
uint8_t RXindex5 = 0;

// 全局设备句柄
extern rt_device_t uart2_dev;
extern rt_device_t uart3_dev;
extern rt_device_t uart4_dev;
extern rt_device_t uart5_dev;

extern struct rt_semaphore jy901_sem; // 声明信号量
extern struct rt_semaphore ms53l_sem; // 声明信号量

// 配置结构体
struct serial_configure uart2_config = RT_SERIAL_CONFIG_DEFAULT; // 串口2配置结构体 为默认
struct serial_configure uart3_config = RT_SERIAL_CONFIG_DEFAULT; // 串口3配置结构体 为默认
struct serial_configure uart4_config = RT_SERIAL_CONFIG_DEFAULT; // 串口4配置结构体 为默认
struct serial_configure uart5_config = RT_SERIAL_CONFIG_DEFAULT; // 串口5配置结构体 为默认
// 结构体初始化列表只能用于初始化声明中，不能用于赋值语句。

/* 默认配置
 * #define RT_SERIAL_CONFIG_DEFAULT
    {
        BAUD_RATE_115200,   //    115200 bits/s
        DATA_BITS_8,        //    8 databits
        STOP_BITS_1,        //    1 stopbit
        PARITY_NONE,        //    No parity
        BIT_ORDER_LSB,      //    LSB first sent
        NRZ_NORMAL,         //    Normal mode
        RT_SERIAL_RB_BUFSZ, //    Buffer size
        0
     }
 */

/****************************** usart2_init BEGIN ******************************
 * 函    数：usart2_init
 * 功    能：初始化串口2设备
 *           包括查找设备，打开设备，配置波特率，设置回调函数
 * 参    数：boud - 波特率
 * 返 回 值：无
 * 注    意：波特率必须与硬件配置一致
 *           若需修改配置需要在对应init函数中修改uart2_config的结构体成员值
 ******************************************************************************/
void usart2_init(uint32_t boud)
{
    uint8_t usrt_result = 0;
    uart2_dev = rt_device_find("uart2"); // 查找设备
    if(uart2_dev == RT_NULL)
    {
        return;
    }
    // 读写模式||中断接收
    usrt_result = rt_device_open(uart2_dev, RT_DEVICE_FLAG_RDWR|RT_DEVICE_FLAG_INT_RX);
    if(usrt_result < 0) // 配置失败
    {
        return;
    }
    uart2_config.baud_rate = boud; // 配置波特率
    rt_device_control(uart2_dev, RT_DEVICE_CTRL_CONFIG, (void*)&uart2_config); // 写入串口配置
    rt_device_set_rx_indicate(uart2_dev, uart2_function); // 配置回调函数
    fly_control_init_status |= 0b00000001;//成功标志位
}
/****************************** usart2_init END ********************************/

/****************************** usart3_init BEGIN ******************************
 * 函    数：usart3_init
 * 功    能：初始化串口3设备
 *           包括查找设备，打开设备，配置波特率，设置回调函数
 * 参    数：boud - 波特率
 * 返 回 值：无
 ******************************************************************************/
void usart3_init(uint32_t boud)
{
    uint8_t usrt_result = 0;
    uart3_dev = rt_device_find("uart3"); // 查找设备
    if(uart3_dev == RT_NULL)
    {
        return;
    }
    // 读写模式||中断接收
    usrt_result = rt_device_open(uart3_dev, RT_DEVICE_FLAG_RDWR|RT_DEVICE_FLAG_INT_RX);
    if(usrt_result < 0) // 配置失败
    {
        return;
    }
    uart3_config.baud_rate = boud; // 配置波特率
    rt_device_control(uart3_dev, RT_DEVICE_CTRL_CONFIG, (void*)&uart3_config); // 写入串口配置
    rt_device_set_rx_indicate(uart3_dev, uart3_function); // 配置回调函数
    fly_control_init_status |= 0b00000010;//成功标志位
    fly_control_init_status |= 0b01000010;//成功标志位
}
/****************************** usart3_init END ********************************/

/****************************** usart4_init BEGIN ******************************
 * 函    数：usart4_init
 * 功    能：初始化串口4设备
 *           包括查找设备，打开设备，配置波特率，设置回调函数
 * 参    数：boud - 波特率
 * 返 回 值：无
 ******************************************************************************/
void usart4_init(uint32_t boud)
{
    uint8_t usrt_result = 0;
    uart4_dev = rt_device_find("uart4"); // 查找设备
    if(uart4_dev == RT_NULL)
    {
        return;
    }
    // 读写模式||中断接收
    usrt_result = rt_device_open(uart4_dev, RT_DEVICE_FLAG_RDWR|RT_DEVICE_FLAG_INT_RX);
    if(usrt_result < 0) // 配置失败
    {
        return;
    }
    uart4_config.baud_rate = boud; // 配置波特率
    rt_device_control(uart4_dev, RT_DEVICE_CTRL_CONFIG, (void*)&uart4_config); // 写入串口配置
    rt_device_set_rx_indicate(uart4_dev, uart4_function); // 配置回调函数
    fly_control_init_status |= 0b00000100;//成功标志位
}
/****************************** usart4_init END ********************************/

/****************************** usart5_init BEGIN ******************************
 * 函    数：usart5_init
 * 功    能：初始化串口5设备
 *           包括查找设备，打开设备，配置波特率，设置回调函数
 * 参    数：boud - 波特率
 * 返 回 值：无
 ******************************************************************************/
void usart5_init(uint32_t boud)
{
    uint8_t usrt_result = 0;
    uart5_dev = rt_device_find("uart5"); // 查找设备
    if(uart5_dev == RT_NULL)
    {
        return;
    }
    // 读写模式||中断接收
    usrt_result = rt_device_open(uart5_dev, RT_DEVICE_FLAG_RDWR|RT_DEVICE_FLAG_INT_RX);
    if(usrt_result < 0) // 配置失败
    {
        return;
    }
    uart5_config.baud_rate = boud; // 配置波特率
    rt_device_control(uart5_dev, RT_DEVICE_CTRL_CONFIG, (void*)&uart5_config); // 写入串口配置
    rt_device_set_rx_indicate(uart5_dev, uart5_function); // 配置回调函数
    fly_control_init_status |= 0b00001000;//成功标志位
}
/****************************** usart5_init END ********************************/

/****************************** uart2_function BEGIN ***************************
 * 函    数：uart2_function
 * 功    能：串口2接收回调函数
 * 参    数：无
 * 返 回 值：RT_EOK - 成功
 *           其他 - 错误码
 * 注    意：无
 ******************************************************************************/
rt_err_t uart2_function()
{
    int8_t buffer;
    rt_device_read(uart2_dev, 0, &buffer, 1); // 一次读一个数据
    RxData2[RXindex2++] = buffer; // 写入缓存数组
    if (RXindex2 >= MAX_DATA_LEN2) RXindex2 = 0;
    if(buffer == '\n')
    {
        RxData2[RXindex2] = '\0'; // 写入字符串末尾
        rt_device_write(uart2_dev, 0, RxData2, RXindex2); // 发回去数据 测试使用
        RXindex2 = 0;
    }
    return RT_EOK;
}
/****************************** uart2_function END *****************************/

/****************************** uart3_function BEGIN ***************************/
rt_err_t uart3_function()
{
    int8_t buffer;
    rt_device_read(uart3_dev, 0, &buffer, 1); // 一次读一个数据
    if(MS53L_push((uint8_t)buffer)) {
        rt_sem_release(&ms53l_sem); // 数据包接收完成，释放信号量
    }
    return RT_EOK;
}
/****************************** uart3_function END *****************************/

/****************************** uart4_function BEGIN ***************************/
rt_err_t uart4_function()
{
    int8_t buffer;
    rt_device_read(uart4_dev, 0, &buffer, 1); // 一次读一个数据
    RxData4[RXindex4++] = buffer; // 写入缓存数组
    if (RXindex4 >= MAX_DATA_LEN4) RXindex4 = 0;
    if(buffer == '\n')
    {
        RxData4[RXindex4] = '\0'; // 写入字符串末尾
#if RT_THREAD_SERIAL_DEBUG == 1
        Serial_printf(SERIAL4, "send:%s",RxData4);
#endif

        at_parse((const char*)RxData4); // 解析AT指令
        RXindex4 = 0;
    }
    return RT_EOK;
}
/****************************** uart4_function END *****************************/

/****************************** uart5_function BEGIN ***************************/
rt_err_t uart5_function()
{
    int8_t buffer;
    rt_device_read(uart5_dev, 0, &buffer, 1); // 一次读一个数据
    uint8_t jy_type = JY_push((uint8_t)buffer);
    if(jy_type == JY61P_GYRO_ID) {
        jy901_rx_state_flag = JY61P_GYRO_ID;
        rt_sem_release(&jy901_sem); // 仅在接收到GYRO包时，释放信号量
    }
    else if(jy_type == JY61P_ACC_ID) {
        jy901_rx_state_flag = JY61P_ACC_ID;
        rt_sem_release(&jy901_sem); // 仅在接收到ACC包时，释放信号量
    }
    else if(jy_type == JY61P_ANGLE_ID) {
        jy901_rx_state_flag = JY61P_ANGLE_ID;
        rt_sem_release(&jy901_sem); // 仅在接收到ANGLE包时，释放信号量
    }
    return RT_EOK;
}
/****************************** uart5_function END *****************************/





